// 迭代器（类似js的那些数组方法）
// iterator：仅要求实现一个方法next
// 几个迭代器方法：iter（在不可变引用上创建迭代器），into_iter（创建的迭代器会获得所有权），iter_mut（迭代可变的引用）

// 消耗迭代器的方法
// next方法即消耗型适配器
// sum方法
// collect方法把结果收集到一个集合中

// 生成迭代器map：接受一个闭包，闭包作用与每个元素产生一个新的迭代器

// 创建自定义迭代器

// 使用闭包捕获环境
// filter方法：接受一个闭包，返回bool，最后返回一个新的迭代器。类似于js的filter

// 循环（for）和迭代器的性能：结果是迭代器效果更好，编译出来的汇编代码和手写的一样（零开销抽象）

#[cfg(test)]
mod tests {
    #[test]

    fn iterator() {
        let v1 = vec![1, 2, 3];
        let mut v1_iter = v1.iter();
        assert_eq!(v1_iter.next(), Some(&1));
        assert_eq!(v1_iter.next(), Some(&2));
        assert_eq!(v1_iter.next(), Some(&3));
        let v2 = vec![1, 2, 3];
        let v2_iter: i32 = v2.iter().sum();
        println!("{}", v2_iter);
        let v3 = vec![1, 3, 4];
        let v3_num: Vec<_> = v3.iter().map(|x| x + 1).collect();
        assert_eq!(v3_num, vec![2, 4, 5]);
    }
}

fn main() {
    println!("hello world!");
}